"""
线程在相同的内存空间，他们可以访问相同的数据

分析：为什么结果是1
是因为，在两个线程或者多个线程操作相同的数据没有设置竞争条件，线程调度算法可以在任一时刻切换线程，你不确定线程访问数据的顺序。
在下面的例子中，第一个线程这里并不一定是就是t1,访问共享变量时存了一个本地引用的副本，然后对该引用的副本进行操作，将其+1，再然后假装模拟耗时的应用程序，
将其瞬秒0.1秒，这个时候与此同时，程序将其切换到第二个线程下，获取的当前的变量database_value 依然是0，因为第一个线程还没有执行完，
现在的状况是两个线程都获取了本地的拷贝，并且将只变更为1，这就是结果为什么是1，而不是2的原因。

ch36 会进行添加竞态条件，也就是第一个线程对该变量执行结束后，第二个线程才能操作该database_value变量，结果将是2
"""

from threading import Thread
import time

# all threads can access this global variable
database_value = 0


def increase():
    global database_value  # needed to modify the global value

    # get a local copy (simulate data retrieving)
    local_copy = database_value

    # simulate some modifying operation
    local_copy += 1
    time.sleep(0.1)

    # write the calculated new value into the global variable
    database_value = local_copy


if __name__ == "__main__":
    print('Start value: ', database_value)

    t1 = Thread(target=increase)
    t2 = Thread(target=increase)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

    print('End value:', database_value)

    print('end main')
